from telethon import TelegramClient, events, sync
from telethon.network import ConnectionTcpAbridged
from telethon.network.mtprotostate import MTProtoState
from telethon.crypto.authkey import AuthKey
from telethon.network.connection.tcpobfuscated import ConnectionTcpObfuscated
from telethon.network.connection.tcpintermediate import IntermediatePacketCodec

import struct
import logging
logging.basicConfig(level=logging.DEBUG)

# import sys
# print(sys.path)

# These example values won't work. You must get your own api_id and
# api_hash from https://my.telegram.org, under API Development.
api_id = 1025907
api_hash = '452b0359b988148995f22ff0f4229750'

client = TelegramClient('session_name', api_id, api_hash, connection=ConnectionTcpAbridged)
#client.start()
#client.connect()

authKey = AuthKey(bytes.fromhex("2c45ed62da34d41bc82b6ef660760d3b01cb80028b0c363633f1c40ec80d5f4ad9d4ddee646736b6a9465fd7258b8936dedde6a86c69b4a03277ed6c543ccfd31fa8fa9f9449d686b4822b54542c91255231ecfa6aed4a9896cdcc3d5491e7f1b7529cbff75597f262813ced7eb3b5ac1e7e6794ca7aa00c5ea4d1d714e7c276fb63e5f8a1742cf4707eace8a6ec2ed4dcceceabdc7fc92bd099c811931e0da337f1b0271d8ba33e7a4a22fa1e4a913d8220edb0dd3a810ed408f03fe5d7f2d5dd43db4272d314b20a22376c03b0a05423600f4d012e7196ce9b3c45b28a75dbfa053222f5c86d1c6a706a2fd68ca270fd9a6449df1fa15a21837d34f4cf4e95"))
state = MTProtoState(authKey, loggers=client._log)

state.salt = struct.unpack('q', bytes.fromhex("d1b37eebb4997ca9"))[0]
state.id = struct.unpack('q', bytes.fromhex("502368ee46d39313"))[0]

#print(state.id)

""" with open('file_part.txt', 'r') as file:
  data = file.read()
  messageData = bytes.fromhex(data)
  #messageData = bytes.fromhex("146f8265b5342560290000000c000000ec77be7aaa40f90300000000")
  #print(data)
  
  encrypted = state.encrypt_message_data(messageData)

  file.close()
  with open('file_part_encrypted.txt', 'w') as file:
    file.write(encrypted.hex())
    file.close()
    #print(encrypted) """

ConnectionTcpObfuscated.packet_codec = IntermediatePacketCodec
connection = ConnectionTcpObfuscated("", "", 2, loggers=client._log)
obfuscatedIo = connection.obfuscated_io(connection)
#print(encrypted)
#exit()
#encoded = connection.packet_codec.encode_packet(connection.packet_codec, bytes.fromhex("deadbeef"))
#print(encoded)
#exit()

name = "debugPayloads"
#name = "debugRequests"

with open(name + '_before.txt', 'r') as fileBefore:
  data = fileBefore.read()
  lines = data.splitlines()

  with open(name + '_after.txt', 'r') as fileAfter:
    data = fileAfter.read()
    linesAfter = data.splitlines()

    length = len(lines)
    for i in range(length):
      print("processing line %i, of %i", i, length)

      lineBefore = lines[i]
      lineAfter = linesAfter[i]

      messageData = bytes.fromhex(lineBefore)
      messageData = connection.packet_codec.encode_packet(connection.packet_codec, messageData)
      encrypted = obfuscatedIo._encrypt.encrypt(messageData)
      #encrypted = state.encrypt_message_data(messageData) # need to comment padding inside

      #print(encrypted.hex())

      #print(len(encrypted.hex()))
      #print(len(lineAfter))
      #print(encrypted.hex() == lineAfter)
      
      #break
      
      if encrypted.hex() != lineAfter:
        print("lol")

        with open('difference_before.txt', 'w') as file:
          file.write(lineAfter)
          file.close()
        
        with open('difference_after.txt', 'w') as file:
          file.write(encrypted.hex())
          file.close()

        
        #print(encrypted.hex())
        #print(lineAfter)
        exit()
